/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2020. All rights reserved.
 * Generated on: 2020/2/6
 * Function discription: Header file related to the PCIe master chip
 */

#ifndef PCIE_RESET_H
#define PCIE_RESET_H
#include "pcie_chip.h"

/* pcie delay para */
#define PCIE_DELAY_10                (10)
#define PCIE_DELAY_20                (20)
#define PCIE_DELAY_40                (40)
#define PCIE_DELAY_50                (50)
#define PCIE_DELAY_100               (100)
#define PCIE_DELAY_150               (150)
#define PCIE_DELAY_200               (200)
#define PCIE_DELAY_300               (300)
#define PCIE_DELAY_500               (500)
#define PCIE_DELAY_640               (640)
#define PCIE_DELAY_1000              (1000)

/* pcie feature para */
#define PCIE_PER_CTRL_GATE_5118_REG  (0x14880028)  /* clk gating status reg */
#define PCIE_CTRL_RST_REG            (0x1488002c)
#define PCIE_APB_RST_REG             (0x14880034)
#define PCIE_RST_CTRL_5117P_REG0     (0x148A002C)
#define PCIE_RST_CTRL_5117P_REG2     (0x148A0034)
#define PCIE_RST_CTRL_5117V_REG0     (0x148A002C)
#define PCIE_RST_CTRL_5117V_REG2     (0x148A0034)
#define PCIE_CTRL_RST_5610T_REG      (0x14880030)
#define PCIE_CTRL_RST_5610T_VALUE    (0x19F0C0)

/* pcie control reg for 5117p，5117v */
#define PCIE0_IO_CFG_5117P_REG       (0x148A01B4)
#define PCIE1_IO_CFG_5117P_REG       (0x148A01B0)
#define PCIE_PAD_DIO_BASE            (0x14940000) /* pad dio */

/* 17v add new security feature, pcie need to be set to security mode */
#define PCIE_TZPC_MST_REG            (0x10100008)

/* 5610T pcie interface cfg */
#define PCIE0_CTRL_CFG_5610T_REG     (0x10100134)
#define PCIE1_CTRL_CFG_5610T_REG     (0x10100140)
#define PCIE_CTRL_CFG_5610T_VALUE    (0x420539F3)

/* 5118v2 rcd control reg */
#define PCIE_USR_DF_5118V2_REG       (0x14880084)
#define PCIE_RCD_CTRL1_5118V2_REG    (0x14880174)
#define PCIE__RCD_SL2DL_DRV_CFG(val) ((val & (~0x700)) | 0x300)

/* 5182H rcd control reg */
#define PCIE0_PAD_CFG_5182X_REG      (0x14900184)
#define PCIE1_PAD_CFG_5182X_REG      (0x14900188)
#define PCIE_PAD_CFG_5182X_VALUE     (0x18)

/* 5117l gpio control reg length */
#define PCIE_GPIO_CTRL_REG_LEN       (0x4)

#define PCIE_MEM_LIMIT_OFFSET        (0x20)
#define PCIE_PCS_RST_OFFSET          (0x3C)

#define PCIE_DS_REF_CLK_EN           (0x22) /* PCIE io output status */
#define PCIE0_REF_CLK_MASK           (0x7)
#define PCIE1_REF_CLK_MASK           (0x70000)

#define SYS_CTL_PCIE_PORT_ADDR       (0x10100164)

/* gpio multiplex relation */
#define PCIE_IOMUX_GROP1_REG         (0x1490020c)
#define PCIE_IOMUX_FUN_SELECT_REG    (0x14900208)
#define PCIE_IOMUX_GROP1_5117H_REG   (0x14900120)
#define PCIE_IOMUX_GROP_5610T_REG    (0x14900500)

#define BOARD_CFG_QCA(index) (pcie_board_cfg->qca_wifi_attr[index].wifi_qca_enable_gpio)
#define WIFI_QCA_DE_RESET(index) do { \
	if (pcie_is_wifi_qca_chip(index) && (BOARD_CFG_QCA(index) != PCIE_INVALID_INT8)) \
		pcie_undo_reset_qca_chip(BOARD_CFG_QCA(index)); \
} while (0)

#define WIFI_CTL_GPIO_OUTPUT(ret, type, value, ms) do { \
	(ret) |= set_gpio_output_value(wifi_ctl_gpio.type##0_power_gpio, GPIO_IO_##value); \
	(ret) |= set_gpio_output_value(wifi_ctl_gpio.type##1_power_gpio, GPIO_IO_##value); \
	mdelay(PCIE_DELAY_##ms); \
} while (0)

#define GET_1153_CFG(index) do { \
	*had_1153wifi = true; \
	wifi_ctrl_gpio->ext_rf##index##_power_gpio = wifi_gpio.ext_rf##index##_power_gpio; \
	wifi_ctrl_gpio->pcie##index##_reset_gpio = wifi_gpio.pcie##index##_reset_gpio; \
	wifi_ctrl_gpio->wifi##index##_power_gpio = wifi_gpio.wifi##index##_power_gpio; \
} while (0)

#define DE_RESET_PCIE(index, type, ...) ({ \
	int32_t macro_ret = 0; \
	if (pcie_board_cfg->pcie_channel_select & PCIE##index##_MODE_SEL) \
		macro_ret = undo_reset_##type(__VA_ARGS__); \
	macro_ret; \
})

#define GET_PARA(para_index) pcie_para_list[para_index][index]

/* PCIE reset controller */
struct pcie_rst_ctrl_5118 {
	uint8_t pcie_rst_gpio[PCIE_INDEX_MAX];
	uint8_t wifi_rst_gpio[PCIE_INDEX_MAX];
	uint8_t clk_en_bit[PCIE_INDEX_MAX];
	uint8_t apb_rst_bit[PCIE_INDEX_MAX];
	uint8_t mem_limit_bit[PCIE_INDEX_MAX];
	uint8_t phy_rst_bit[PCIE_INDEX_MAX];
	uint8_t pcie_rst_bit[PCIE_INDEX_MAX];
};

/* declared as external interface */
int32_t pcie_undo_reset(bool is_open);

#endif /* PCIE_CHIP_H */
